/**
 * 
 */
package org.optimus.dao;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.optimus.beans.Usuario;
import org.optimus.utils.MyBatisUtil;


/**
 * @author Juan Carlos Roman Perez
 *
 */
public class UsuarioDAO implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private SqlSessionFactory sqlSessionFactory;
		
	public UsuarioDAO(){
		sqlSessionFactory = new MyBatisUtil().getSqlSessionFactory();
	}
	
	public void insertar(Usuario usuario){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.insert("Usuario.insertar",usuario);
			session.commit();
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > insertar : "+e.getMessage());
			session.rollback();
		}finally{
			session.close();
		}
	}
	
	public void actualizar(Usuario usuario){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.update("Usuario.actualizar",usuario);
			session.commit();
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > actualizar : " + e.getMessage());
			session.rollback();
		}finally{
			session.close();
		}
	}
	
	public void actualizarEstado(Usuario usuario){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.update("Usuario.actualizarEstado",usuario);
			session.commit();
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > actualizarEstado : " + e.getMessage());
			session.rollback();
		}finally{
			session.close();
		}
	}
	
	
	
	public void eliminar(Integer id){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.delete("Usuario.eliminar",id);
			session.commit();
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > eliminar : " + e.getMessage());
			session.rollback();
		}finally{
			session.close();
		}
	}
	
	public Usuario buscarPorId(Integer id){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			Usuario usuario = session.selectOne("Usuario.buscarPorId",id);
			return usuario;
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > buscarPorId : " + e.getMessage());
			return null;
		}finally{
			session.close();
		}
	}
	
	public Usuario buscarPorUsuario(Usuario usuario){
		
		SqlSession session = sqlSessionFactory.openSession();
		Usuario tempUsuario = null;

		try {
			
			tempUsuario = session.selectOne("Usuario.buscarPorUsuario",usuario);
			
			if(tempUsuario != null){
				actualizarUltimoAcceso(tempUsuario.getId());
			}

			return tempUsuario;
			
		} catch (Exception e) {
			
			System.out.println(" Error en UsuarioDAO > buscarPorUsuario : "+e.getMessage());
			return tempUsuario;
			
		}finally{
			session.close();
		}
	}
	
	
	public List<Usuario> buscarTodos(){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			List<Usuario> usuarios = session.selectList("Usuario.buscarTodos");
			return usuarios;
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > buscarTodos : " + e.getMessage());
			return null;
		}finally{
			session.close();
		}
	}
	
	
	private void actualizarUltimoAcceso(Integer id){
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.update("Usuario.actualizarUltimoAcceso",id);
			session.commit();
		} catch (Exception e) {
			System.out.println(" Error en UsuarioDAO > actualizarUltimoAcceso :  "+ e.getMessage());
			session.rollback();
		}finally{
			session.close();
		}
	}

}
